public class BM16 {

    /*给出一个升序排序的链表，删除链表中的所有重复出现的元素，只保留原链表中只出现一次的元素。
    * */

    public class ListNode {
        int val;
        ListNode next = null;

        public ListNode(int val) {
            this.val = val;
        }
    }


    public ListNode deleteDuplicates (ListNode head) {
        if (head == null || head.next == null) {
            return head; // 空链表或者只有一个节点，直接返回
        }

        ListNode dummy = new ListNode(0); // 创建虚拟头节点，方便处理头节点的情况
        dummy.next = head;
        ListNode prev = dummy;
        ListNode cur = head;
        boolean isDuplicate = false; // 标记是否已经遇到了重复的元素

        while (cur != null && cur.next != null) {
            if (cur.val == cur.next.val) {
                isDuplicate = true; // 当前节点与下一个节点值相同，标记为重复元素
                cur.next = cur.next.next; // 删除下一个节点
            } else {
                if (isDuplicate) {
                    prev.next = cur.next; // 删除当前节点
                    isDuplicate = false; // 重置标记
                } else {
                    prev = cur; // 移动 prev 指针到当前节点
                }
                cur = cur.next; // 移动当前节点指针到下一个节点
            }
        }

        if (isDuplicate) {
            prev.next = cur.next; // 删除最后一个节点（如果最后一个节点是重复的）
        }

        return dummy.next; // 返回处理后的链表

    }
}
